--- 模块功能：矩阵键盘测试
-- @module powerKey
-- @author openLuat
-- @license MIT
-- @copyright openLuat
-- @release 2018.06.13

require"sys"
module(..., package.seeall)


local setGpioFnc_315Study = pins.setup(pio.P0_7,0)

local wireless_315_rt_study_timeout_ID
--[[
函数名：
功能  ：
参数  ：
返回值：无
]]
function PowerSwitch_ChangeByKeynum(num)
    if num == 1 then
		rtALiYun.app_recv_property_x({powerstate = rtALiYun.setPowerSwitchInvert("powerstate")}, 1)
    end
    if num == 2 then
    	rtALiYun.app_recv_property_x({PowerSwitch_2 = rtALiYun.setPowerSwitchInvert("PowerSwitch_2")}, 1)
    end
    if num == 3 then
    	rtALiYun.app_recv_property_x({PowerSwitch_3 = rtALiYun.setPowerSwitchInvert("PowerSwitch_3")}, 1)
    end
    if num == 4 then
    	rtALiYun.app_recv_property_x({PowerSwitch_4 = rtALiYun.setPowerSwitchInvert("PowerSwitch_4")}, 1)
    end
end 
--[[
函数名：
功能  ：
参数  ：
返回值：无
]]
function gpio315WirelessIntFnc(msg)
    log.info("gpio315WirelessIntFnc",msg,getGpioFnc_315D0())
    log.info("gpio315WirelessIntFnc",msg,getGpioFnc_315D1())
    log.info("gpio315WirelessIntFnc",msg,getGpioFnc_315D2())
    log.info("gpio315WirelessIntFnc",msg,getGpioFnc_315D3())   

    local D0 = getGpioFnc_315D0()

    local D1 = getGpioFnc_315D1()

    local D2 = getGpioFnc_315D2()

    local D3 = getGpioFnc_315D3()


    --上升沿中断
    if msg == 1 then
    	if rtALiYun.get_wireless_315_rt() == 1 then
	    	if D0 == 1 or D1 == 1 or D2 == 1 or D3 == 1 then
	    		rtALiYun.set_wireless_315_rt(0)
	    		if wireless_315_rt_study_timeout_ID ~= nil then
	    			sys.timerStop(wireless_315_rt_study_timeout_ID)
	    		end
	    		log.info("wireless_315_rt_study_ok")
	    		return
	    	end
    	end

    	local keyNum = 0
    	if D0 == 1 then
    		keyNum = 1
    	end
    	if D1 == 1 then
    		keyNum = 2
    	end
    	if D2 == 1 then
    		keyNum = 3
    	end
    	if D3 == 1 then
    		keyNum = 4
    	end
    	if rtALiYun.get_wireless_315_rt() == 0 then
    		PowerSwitch_ChangeByKeynum(keyNum)
    	end
    --下降沿中断
    else

    end
end

--GPIO13配置为中断，可通过getGpio13Fnc()获取输入电平，产生中断时，自动执行gpio13IntFnc函数
getGpioFnc_315D0 = pins.setup(pio.P0_19,gpio315WirelessIntFnc)
getGpioFnc_315D1 = pins.setup(pio.P0_18,gpio315WirelessIntFnc)
getGpioFnc_315D2 = pins.setup(pio.P0_15,gpio315WirelessIntFnc)
getGpioFnc_315D3 = pins.setup(pio.P0_14,gpio315WirelessIntFnc)

--[[
函数名：
功能  ：
参数  ：
返回值：无
]]
local function wireless_315_rt_study_timeout()
	log.info("wireless_315_rt_study_timeout")
	rtALiYun.set_wireless_315_rt(0)
end 
--[[
函数名：
功能  ：
参数  ：
返回值：无
]]
local function wireless_315_rt_studying()
	log.info("wireless_315_rt_studying")
	setGpioFnc_315Study(0)
	wireless_315_rt_study_timeout_ID = sys.timerStart(wireless_315_rt_study_timeout,10000)
end 

--[[
函数名：
功能  ：
参数  ：
返回值：无
]]
function wireless_315_rt_study()
	if rtALiYun.get_wireless_315_rt() == 0 or rtALiYun.get_wireless_315_rt() == 3 then
		log.info("wireless_315_rt_study")
		rtALiYun.set_wireless_315_rt(1)

		setGpioFnc_315Study(1)
    	sys.timerStart(wireless_315_rt_studying,1000)
    end
end
--[[
函数名：
功能  ：
参数  ：
返回值：无
]]
local function wireless_315_rt_clear_ok()
	log.info("wireless_315_rt_clear_ok")

	setGpioFnc_315Study(0)
	rtALiYun.set_wireless_315_rt(0)
end 
--[[
函数名：
功能  ：
参数  ：
返回值：无
]]
function wireless_315_rt_clear()
	if rtALiYun.get_wireless_315_rt() == 0 or rtALiYun.get_wireless_315_rt() == 3 then

		log.info("wireless_315_rt_clear")

		rtALiYun.set_wireless_315_rt(2)

		setGpioFnc_315Study(1)
    	sys.timerStart(wireless_315_rt_clear_ok,12000)
    end
end
--[[
函数名：
功能  ：
参数  ：
返回值：无
]]
local function keyMsg(msg)
    --msg.key_matrix_row：行
    --msg.key_matrix_col：列
    --msg.pressed：true表示按下，false表示弹起
    log.info("keyMsg",msg.key_matrix_row,msg.key_matrix_col,msg.pressed)
    local keyNum = msg.key_matrix_row * (msg.key_matrix_col + 1)
    log.info("keyNum",keyNum)

    if msg.pressed == true then
    	keyProc(keyNum)
    end
end

--[[
函数名：
功能  ：
参数  ：
返回值：无
]]
function keyProc(keyNum)

    if keyNum == 3 or keyNum == 2 or keyNum == 1 or keyNum == 0 then
    	if rtALiYun.get_LocalKeySwitch() == 0 then
    		PowerSwitch_ChangeByKeynum(4 - keyNum)
    	end
    end

    --if keyNum == 0 then
    	--wireless_315_rt_study()
    --end
end

--注册按键消息处理函数
rtos.on(rtos.MSG_KEYPAD,keyMsg)
--初始化键盘阵列
--第一个参数：固定为rtos.MOD_KEYPAD，表示键盘
--第二个参数：目前无意义，固定为0
--第三个参数：表示键盘阵列keyin标记，例如使用了keyin0、keyin1、keyin2、keyin3，则第三个参数为1<<0|1<<1|1<<2|1<<3 = 0x0F
--第三个参数：表示键盘阵列keyout标记，例如使用了keyout0、keyout1、keyout2、keyout3，则第四个参数为1<<0|1<<1|1<<2|1<<3 = 0x0F
rtos.init_module(rtos.MOD_KEYPAD,0,0x0F,0x01)
